﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;
using System.Text.RegularExpressions;

namespace MiraPark
{
    public partial class FormRecebeMensalidade : Form
    {
        CabineVO cabineVO = CabineVO.CreateCabineVO();
        UsuarioVO usuarioVO = UsuarioVO.CreateUsuarioVO();
        
        public FormRecebeMensalidade()
        {
            InitializeComponent();
            this.labelMensalista.Text = "";

        }

        private void FormRecebeMensalidade_Load(object sender, EventArgs e)
        {
            List<FormaPagamentoVO> listFormaPagamentoVOs = ModelBO.getFormaPagamentos();
            listFormaPagamentoVOs.Add(FormaPagamentoVO.CreateFormaPagamentoVO(-1, ""));
            this.comboBoxFormaPagamento.DataSource = listFormaPagamentoVOs;
            this.comboBoxFormaPagamento.SelectedValue = -1;

            List<MensalistaVO> listMensalistaVOs = ModelBO.getMensalistas(true);

            this.flowLayoutPanelMensalistas.Controls.Clear();
            foreach (MensalistaVO mensalistaVO in listMensalistaVOs)
            {
                Button mybutton = new Button();
                mybutton.Font = new System.Drawing.Font("Verdana", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                mybutton.Name = "button" + mensalistaVO.clienteVO.nome.Trim();
                mybutton.Size = new System.Drawing.Size(250, 51);
                mybutton.TabIndex = 2;
                mybutton.Text = mensalistaVO.clienteVO.nome.ToUpper().Trim()+" ("+mensalistaVO.tabelaMensalVO.tabelaMensal+")";
                mybutton.UseVisualStyleBackColor = true;
                mybutton.Click += new EventHandler(this.buttonMensalista1_Click);
                mybutton.Tag = mensalistaVO;

                this.flowLayoutPanelMensalistas.Controls.Add(mybutton);

            }

            vScrollBar1.Minimum = this.flowLayoutPanelMensalistas.VerticalScroll.Minimum;
            vScrollBar1.Maximum = this.flowLayoutPanelMensalistas.VerticalScroll.Maximum;//modelos.Count + 3;
            vScrollBar1.LargeChange = this.flowLayoutPanelMensalistas.VerticalScroll.LargeChange;
            vScrollBar1.SmallChange = this.flowLayoutPanelMensalistas.VerticalScroll.SmallChange;
            vScrollBar1.Value = this.flowLayoutPanelMensalistas.VerticalScroll.Value;


        }
        private void buttonMensalista1_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            MensalistaVO mensalistaVO = (MensalistaVO)btn.Tag;
            setMensalista(mensalistaVO);
        }

        public void setCabine(CabineVO cabineVO, UsuarioVO usuarioVO)
        {
            this.cabineVO = cabineVO;
            this.usuarioVO = usuarioVO;
        }
        public void setMensalista(MensalistaVO mensalistaVO)
        {
            labelMensalista.Text = mensalistaVO.clienteVO.nome;
            labelMensalista.Tag = mensalistaVO;

            DateTime? dtRef = null;

            List<MensalistaXFranquiaVO> listMensalistaXFranquiaVOs = ModelBO.getMensalistaXFranquia(mensalistaVO.idMensalista);
            for (int i = 0; i < 3; i++)
            {
                TextBox txtBoxIni = (TextBox)this.groupBoxHistorico.Controls["textBoxDataIni" + (i + 1)];
                TextBox txtBoxFim = (TextBox)this.groupBoxHistorico.Controls["textBoxDataFim" + (i + 1)];
                if ((i + 1) > listMensalistaXFranquiaVOs.Count)
                {
                    txtBoxIni.Text = "";
                    txtBoxFim.Text = "";
                }
                else
                {
                    txtBoxIni.Text = listMensalistaXFranquiaVOs[i].dataIni.ToShortDateString();
                    txtBoxFim.Text = listMensalistaXFranquiaVOs[i].dataFim.ToShortDateString();
                    dtRef = (dtRef == null ? listMensalistaXFranquiaVOs[i].dataFim.AddDays(1) : new DateTime(Math.Max(listMensalistaXFranquiaVOs[i].dataFim.AddDays(1).Ticks, dtRef.Value.Ticks)));
                }
            }
            this.dateTimePickerIni.MinDate = (dtRef == null?new DateTime(1980,1,1):dtRef.Value);
            if (dtRef == null) dtRef = DateTime.Today;
            this.dateTimePickerIni.Value = dtRef.Value;
            this.dateTimePickerFim.Value = dtRef.Value.AddMonths(1).AddDays(-1);

            TabelaMensalVO tabelaMensalVO = ModelBO.getTabelaMensal(mensalistaVO.tabelaMensalVO.idTabelaMensal);
            this.numericUpDownValor.Value = tabelaMensalVO.valor * mensalistaVO.qtdVagas;

            this.comboBoxFormaPagamento.SelectedValue = -1;
        }

        private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            //flowLayoutPanelMais.ScrollControlIntoView(flowLayoutPanelMais.Controls[e.NewValue]);
            this.flowLayoutPanelMensalistas.VerticalScroll.Value = e.NewValue; //Math.Min(e.NewValue, this.flowLayoutPanelMensalistas.VerticalScroll.Maximum);
        }
       
        private void buttonFecharJanela_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void dateTimePickerIni_ValueChanged(object sender, EventArgs e)
        {
            this.dateTimePickerFim.Value = this.dateTimePickerIni.Value.AddMonths(1).AddDays(-1);
        }

        private void buttonContratar_Click(object sender, EventArgs e)
        {
            StringBuilder mensagem = new StringBuilder();

            if (this.labelMensalista.Tag == null)
            {
                MessageBox.Show("Informe o mensalista", "Aviso");
                return;
            }
            if (this.comboBoxFormaPagamento.SelectedValue==null || (int)this.comboBoxFormaPagamento.SelectedValue == -1)
            {
                MessageBox.Show("Informe a Forma de pagamento", "Aviso");
                return;
            }

            DialogResult dr = MessageBox.Show(this, "Confirma a contratação do período?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                DateTime dtRef = DateTime.Now;

                MensalistaVO mensalistaVO = (MensalistaVO)this.labelMensalista.Tag;
                ModelBO.getMensalistaXVeiculos(mensalistaVO);
                MensalistaXFranquiaVO mensalistaXFranquiaVO = MensalistaXFranquiaVO.CreateMensalistaXFranquiaVO();
                mensalistaXFranquiaVO.idMensalista = mensalistaVO.idMensalista;
                mensalistaXFranquiaVO.dataIni = this.dateTimePickerIni.Value;
                mensalistaXFranquiaVO.dataFim = this.dateTimePickerFim.Value;

                RecebimentoVO recebimentoVO = RecebimentoVO.CreateRecebimentoVO();
                recebimentoVO.dtPagamento = dtRef.Date;
                recebimentoVO.dtVencimento = dtRef.Date;
                recebimentoVO.idConvenio = -1;
                recebimentoVO.idMensalista = mensalistaXFranquiaVO.idMensalista;
                recebimentoVO.idMovimentacao = -1;
                recebimentoVO.recebimento = "Renovação de Mensalidade";
                recebimentoVO.valor = this.numericUpDownValor.Value;
                recebimentoVO.valorRec = this.numericUpDownValor.Value;
                recebimentoVO.formaPagamentoVO.idFormaPagamento = (int)this.comboBoxFormaPagamento.SelectedValue;

                MovimentacaoVO movimentacaoVO = MovimentacaoVO.CreateMovimentacaoVO();
                movimentacaoVO.entrada = dtRef;
                movimentacaoVO.especie = MovimentacaoVO.Especie.Mensalidade;
                movimentacaoVO.fechCabine = false;
                movimentacaoVO.fechConvenio = false;
                movimentacaoVO.fechDiario = false;
                movimentacaoVO.idCabineE = cabineVO.idCabine;
                movimentacaoVO.idCabineS = cabineVO.idCabine;
                movimentacaoVO.idMensalista = mensalistaVO.idMensalista;
                movimentacaoVO.idConvenio = -1;
                movimentacaoVO.obs = "";
                movimentacaoVO.placa = "";
                movimentacaoVO.saida = dtRef;
                movimentacaoVO.ticket = -1;
                movimentacaoVO.valor = this.numericUpDownValor.Value;
                
                mensagem = new StringBuilder();
                for (int i = 0; i < 2; i++)
                {
                    mensagem.Append(Ticket.getHeader());
                    mensagem.AppendLine("<ce>RECIBO DE MENSALIDADE </ce>");
                    mensagem.AppendLine("------------------------------------------------");
                    mensagem.AppendLine("Via "+(i==0?"Estacionamento":"Cliente"));
                    mensagem.AppendLine("");
                    mensagem.AppendLine("Mensalista: " + mensalistaVO.clienteVO.nome);
                    mensagem.AppendLine("Tabela: " + mensalistaVO.tabelaMensalVO.tabelaMensal);
                    mensagem.AppendLine("Periodo contratado: " + mensalistaXFranquiaVO.dataIni.ToShortDateString() + " a " + mensalistaXFranquiaVO.dataFim.ToShortDateString());
                    mensagem.AppendLine("Vagas contratadas: " + mensalistaVO.qtdVagas);
                    mensagem.AppendLine("");
                    mensagem.AppendLine("Data Pagamento: " + dtRef.Date.ToShortDateString());
                    mensagem.AppendLine("Valor: " + recebimentoVO.valorRec.ToString("#,##0.00"));
                    mensagem.AppendLine("Forma de Pagto: " + this.comboBoxFormaPagamento.SelectedItem);
                    mensagem.AppendLine("");
                    mensagem.AppendLine("Veiculos credenciados:");
                    foreach (MensalistaxVeiculoVO mensalistaXVeicuoVO in mensalistaVO.mensalistaxVeiculoVOs)
                    {
                        mensagem.AppendLine("\t" + mensalistaXVeicuoVO.placa);
                    }
                    mensagem.AppendLine("");
                    mensagem.Append(Ticket.getFooter(false,cabineVO, usuarioVO));
                }

                while (true)
                {
                    if (!Ticket.checkPrint() || !Ticket.printTicket(mensagem.ToString()))
                    {
                        DialogResult dr2 = MessageBox.Show(this, "Tentar novamente?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (dr2.ToString().Equals("Yes"))
                        {
                            continue;
                        }
                        dr2 = MessageBox.Show(this, "Deseja efetivar a contratação sem a emissão do recibo?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (dr2.ToString().Equals("Yes"))
                        {
                            FormMessage formx = new FormMessage();
                            formx.setText(cutText(mensagem.ToString()));
                            formx.ShowDialog(this);
                            break;
                        }
                        else
                        {
                            return;
                        }
                    }
                    else
                    {
                        break;
                    }
                }

                recebimentoVO.idMovimentacao = (int)ModelBO.newMovimentacao(movimentacaoVO);
                ModelBO.newRecebimento(recebimentoVO);
                ModelBO.newMensalistaXFranquia(mensalistaXFranquiaVO);
                

                MessageBox.Show("Período contratado!");
                
                this.Close();
            }
        }

        private string cutText(string texto)
        {
            string textoTemp = "";

            // tirar o html
            textoTemp = Regex.Replace(texto, "<[\\d\\w\\s/\\\\\\-_\\+=:;,\\.\\*\\$\\#\\[\\]~\\{\\}\\\"\\\'\\^~\\(\\)@!\\?%&]*>", "");

            return textoTemp;
        }
    }
}
